Skip to main content

Multicore

Im Objekt Taskkonfiguration in der Registerkarte Registerkarte: Taskgruppen wird die Zuordnung von Task und CPU-Kern angezeigt.

Heutzutage besitzen immer mehr Steuerungen Prozessoren mit mehreren CPU-Kernen.

Wenn CODESYS auf einer Mehrkernsteuerung ausgeführt wird, ohne das Multicore-Feature zu verwenden, wird das Verteilen der Tasks vom Scheduler des Betriebssystems übernommen. Vorausgesetzt, dass eine Applikation mit mehrere Tasks ausgeführt wird. In diesem Fall hat man keinen direkten Einfluss auf die Verteilung der Tasks. Je nach Lastverteilung können die Tasks dann auch auf unterschiedlichen CPU-Kernen laufen.

Mit dem CODESYS-Feature Multicore können, unter Berücksichtigung der erworbenen Anzahl von CPU-Kernen, die IEC-Tasks selbst dedizierten CPU-Kernen zugewiesen werden. Dies kann zu einer Verbesserung der Performance führen. Das IEC-Programm sollte hierfür auf mehrere Tasks aufgeteilt werden.

Bei der Verteilung der IEC-Tasks auf CPU-Kerne gibt es in CODESYS zwei grundlegend unterschiedliche Strategien:

  • IEC-Task, die fest an einen CPU-Kern gebunden ist:

    Die Task wird immer auf diesem bestimmten CPU-Kern ausgeführt. Mehrere Tasks können durch Gruppierung an einen CPU-Kern gebunden werden. Dies ist beispielsweise dann sinnvoll, wenn das IEC-Programm noch nicht in der Lage ist, auf mehreren CPU-Kernen gleichzeitig zu laufen.

  • IEC-Task wird auf allen CPU-Kernen ausgeführt:

    Die Verteilung einer oder mehrerer Tasks einer Gruppe auf die CPU-Kerne übernimmt das Betriebssystem der Steuerung.

Wichtig

Bei der Verteilung der IEC-Tasks auf CPU-Kerne ergeben sich einige Änderungen im Verhalten im IEC-Programm, die berücksichtigt werden müssen.

  • Die Abarbeitung von IEC-Tasks nach Priorität ist nicht mehr gegeben! Nur wenn die Tasks gemeinsam auf einen CPU-Kern gebunden sind, werden sie nach ihrer Priorität abgearbeitet.

  • Die Zykluskonsistenz der Daten in der IEC-Task mit höchster Priorität ist nicht mehr gegeben. Daher müssen Daten am Beginn des IEC-Taskzyklus lokal kopiert werden, wenn sich die Werte innerhalb des Zyklus nicht verändern sollen.

  • Für alle Tasks gibt es ein gemeinsames Prozessabbild, aus dem sich die Tasks bedienen. Am Anfang jeder Task wird die Funktion ReadInputs() und am Ende die Funktion WriteOutputs() aufgerufen. Somit ist das EVA-Prinzip für jede Task einzeln betrachtet gültig. Diese Funktionen lesen und schreiben in das gemeinsam genutzte Prozessabbild. Erst wenn die Buszyklustask aufgerufen wird, wird das Prozessabbild auch physikalisch geschrieben und die Pakete übertragen. Die Buszyklustask wartet jedoch auf jeden Aufruf von WriteOutputs und ReadInputs der Tasks. Somit wird die Datenkonsistenz innerhalb der Buszyklustask sichergestellt.

    • Ausgänge können nur einer Task zugeordnet werden.

    • Eingänge können mehreren Tasks zugeordnet werden, ein direkter Zugriff ist jedoch zu vermeiden. Es müssen die Eingänge mittels atomarer Operationen in lokale Variablen der Task geschrieben werden.

    • Eine zweite Task, die parallel zur ersten Task das Prozessabbild mit ReadInputs() aktualisiert, aktualisiert ebenfalls die Eingänge der ersten Task während diese läuft.

    • Die Datenkonsistenz einer Task ist dadurch nur auf Singlekernen für die höchstpriore Task sichergestellt.

    Tipp

    Sie können die Buszyklustask auf der Registerkarte SPS-Einstellungen einstellen.

    Sie können die EA-Zugriffe auf der Registerkarte Registerkarte: Taskaufstellung anzeigen.

    Für weitere Informationen siehe Buszyklus-Task

  • Für konsistente Zähler (Inkrementer, Dekrementer) sollte immer die atomare externe Bibliotheksfunktion SysCpuAtomicAdd() verwendet werden (Details siehe: SysCpuHandling.library)

Wichtig

Datenkonsistenz von Daten

  • Bitzugriffe (Datentyp BIT) werden nicht konsistent (atomar) im IEC-Programm auf Mehrkern-CPUs verarbeitet. Hierzu empfehlen wir die Verwendung der externen Bibliotheksfunktion SysCpuTestAndSetBit(). (Details siehe SysCpuHandling.library)

  • Einfache Datentypen bis 32 Bit Breite (BOOL, BYTE, WORD/INT, DWORD/DINT, …) werden konsistent (atomar) im IEC-Programm auch auf Mehrkern-CPUs verarbeitet.

  • 64-Bit Datentypen (LINT, LWORD, LREAL) werden im IEC-Programm nur auf 64-Bit Systemen und Mehrkernsystemen konsistent (atomar) verarbeitet. Hier müssen Sie keine Vorkehrungen treffen.

  • Für den Zugriff auf komplexe Datentypen (STRINGs, FBs, STRUCTs, ARRAYs) müssen Sie selbst Vorkehrungen für die Synchronisierung/Konsistenz treffen.

  • Sie können in der Taskkonfiguration in der Registerkarte Variablenverwendung ermitteln, ob auf eine Variable in einer IEC-Task schreibend oder lesend zugegriffen wird.

  • Auf Mehrkernsystemen kann es zu einem so genannten Memory Reordering Effekt kommen. Näheres dazu siehe IEC-Operator __MemoryBarrier().

Tasks auf mehrere Prozessorkerne verteilen

Voraussetzung: Sie haben in Ihrer Applikation mindestens zwei Tasks definiert, beispielsweise MainTask (IEC-Task) und LowTask (IEC-Task).

  1. Öffnen Sie das Objekt Taskkonfiguration im Editor.

  2. Wechseln Sie zur Registerkarte Taskgruppen.

    Die Übersicht zeigt die Standard-Taskgruppe IEC-Tasks.

  3. Fügen Sie mit der Schaltfläche Gruppe hinzufügen eine neue Taskgruppe hinzu.

    Die Gruppe NewGroup wird hinzugefügt.

  4. Doppelklicken Sie auf den Gruppennamen NewGroup und ändern sie ihn in LowGroup.

  5. Wählen Sie unter Core eine Zuordnung aus, beispielsweise 1.

  6. Öffnen Sie die Task LowTask (IEC-Task) im Editor.

  7. Wählen Sie unter Taskgruppe die neu erstelle Gruppe LowGroup aus.

    Die Task LowTask wird nun durch ihre Gruppenzugehörigkeit LowGroup zu vom Prozessorkern 1 abgearbeitet.

Prozessorauslastung pro Prozessorkern im Trace anzeigen

Sie können in CODESYS die Prozessorauslastung in einem Objekt DeviceTrace visualisieren.

Für weitere Informationen zur Darstellung von Geräte-Traces im Projekt siehe: Zugriff auf alle Traces der Steuerung